package com.koocloud.electroplatemanage.auth.service.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.koocloud.electroplatemanage.auth.mapper.ILoginDao;
import com.koocloud.electroplatemanage.auth.service.ILoginService;
import com.koocloud.electroplatemanage.common.util.CommonUtils;
import com.koocloud.electroplatemanage.pojo.Permission;
import com.koocloud.electroplatemanage.pojo.User;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;



@Service
public class LoginService implements ILoginService {

	@Resource
	ILoginDao loginDao;

	@Override
	public void insertUser(User authorityUser) {
		loginDao.insertUser(authorityUser);
	}

	@Override
	public User getUserById(String username) {
		return loginDao.getUserById(username);
	}

	/**
	 * 用户登录 返回所拥有的权限列表
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	public Map<String, Object> login(HttpServletRequest request, HttpServletResponse response) {
		Map<String, Object> map = new HashMap<String, Object>();
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username);
		System.out.println(password);
		username = "宇智波鼬";
		password = "888888";
		User user = loginDao.getUserById(username);
		if (user.getPassword().equals(CommonUtils.md5(password))) {
			HttpSession session = request.getSession();
			// 查询此人拥有的菜单
			List authList = findTree2(username);
			// 获取此人所拥有的权限url列表
			List<Map<String, Object>> list = loginDao.selectAuthList(username);
			session.setAttribute("authorityMenu", list);
			session.setAttribute("loginUser", user);
			map.put("data", authList);
			map.put("code", 0);
		} else {
			map.put("code", 1);
			map.put("message", "账号或密码输入错误");
		}
		return map;
	}

	/**
	 * 生成权限树的方法
	 * 
	 * @return
	 */
	public Map<String, Object> findTree(String username) {
		Map<String, Object> data = new HashMap<String, Object>();
		try {// 查询所有菜单
				// String username="zhangsan"; //测试ok
			List<Permission> allMenu = null;
			if (!StringUtils.isEmpty(username)) {
				allMenu = loginDao.findTree(username);				
			} else {
				//allMenu = loginDao.findTree2();
			    allMenu=null;
			}
			// 根节点
			List<Permission> rootMenu = new ArrayList<Permission>();
			for (Permission nav : allMenu) {
				if (nav.getParentId() == -1) {// 父节点是-1的话,为根节点。
					rootMenu.add(nav);
				}
			}
			/* 根据Menu类的order排序 */
			Collections.sort(rootMenu, Permission.order());
			// 为根菜单设置子菜单，getClild是递归调用的
			for (Permission nav : rootMenu) {
				/* 获取根节点下的所有子节点 使用getChild方法 */
				List<Permission> childList = getChild(nav.getId(), allMenu);
				nav.setChildren(childList);// 给根节点设置子节点
			}
			/**
			 * 输出构建好的菜单数据。
			 *
			 */
			data.put("code", 0);
			data.put("list", rootMenu);
			return data;
		} catch (Exception e) {
			data.put("code", 1);
			data.put("list", new ArrayList());
			data.put("message", "无权限");
			return data;
		}
	}

	/**
	 * 根据登录用户名生成权限树的方法 @param username
	 * 
	 * @return
	 */
	public List findTree2(String username) {
		Map<String, Object> data = new HashMap<String, Object>();
		try {// 查询所有菜单
				// String username="zhangsan"; //测试ok
			List<Permission> allMenu = loginDao.findTree(username);
			// 根节点
			List<Permission> rootMenu = new ArrayList<Permission>();
			for (Permission nav : allMenu) {
				if (nav.getParentId() == -1) {// 父节点是-1的话,为根节点。
					rootMenu.add(nav);
				}
			}
			/* 根据Menu类的order排序 */
			Collections.sort(rootMenu, Permission.order());
			// 为根菜单设置子菜单，getClild是递归调用的
			for (Permission nav : rootMenu) {
				/* 获取根节点下的所有子节点 使用getChild方法 */
				List<Permission> childList = getChild(nav.getId(), allMenu);
				nav.setChildren(childList);// 给根节点设置子节点
			}
			/**
			 * 输出构建好的菜单数据。
			 *
			 */
			return rootMenu;
		} catch (Exception e) {
			return new ArrayList();
		}
	}

	/**
	 * 获取子节点
	 * 
	 * @param id      父节点id
	 * @param allMenu 所有菜单列表
	 * @return 每个根节点下，所有子菜单列表
	 */
	public List<Permission> getChild(long id, List<Permission> allMenu) {
		// 子菜单
		List<Permission> childList = new ArrayList<Permission>();
		for (Permission nav : allMenu) {
			// 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
			// 相等说明：为该根节点的子节点。
			if (nav.getParentId() == id) {
				childList.add(nav);
			}
		}
		// 递归
		for (Permission nav : childList) {
			nav.setChildren(getChild(nav.getId(), allMenu));
		}
		Collections.sort(childList, Permission.order());// 排序
		// 如果节点下没有子节点，返回一个空List（递归退出）
		if (childList.size() == 0) {
			return new ArrayList<Permission>();
		}
		return childList;
	}

    /**
     * 获取子节点
     * 
     * @param id      父节点id
     * @param allMenu 所有菜单列表
     * @return 每个根节点下，所有子菜单列表
     */
    public List<Permission> getChildForBtn(long id, long lvl, List<Permission> allMenu) {
        // 子菜单
        List<Permission> childList = new ArrayList<Permission>();
        for (Permission nav : allMenu) {
            // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            // 相等说明：为该根节点的子节点。
            if (nav.getParentId() == id && nav.getLvl() > lvl) {
                childList.add(nav);
            }
        }
        // 递归
        for (Permission nav : childList) {
            nav.setChildren(getChildForBtn(nav.getId(), nav.getLvl(), allMenu));
        }
        Collections.sort(childList, Permission.order());// 排序
        // 如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size() == 0) {
            return new ArrayList<Permission>();
        }
        return childList;
    }

	public Map<String, Object> findMenu(String username) {
		Map<String, Object> data = new HashMap<String, Object>();
		try {// 查询所有菜单
			if (StringUtils.isEmpty(username)) {
				data.put("data", new ArrayList());
			} else {
				List<Permission> allMenu = null;
					allMenu = loginDao.findTree(username);
				// 根节点
				List<Permission> rootMenu = new ArrayList<Permission>();
				for (Permission nav : allMenu) {
					if (nav.getParentId() == -1) {// 父节点是-1的话,为根节点。
						rootMenu.add(nav);
					}
				}
				/* 根据Menu类的order排序 */
				Collections.sort(rootMenu, Permission.order());
				// 为根菜单设置子菜单，getClild是递归调用的
				for (Permission nav : rootMenu) {
					/* 获取根节点下的所有子节点 使用getChild方法 */
					List<Permission> childList = getChild(nav.getId(), allMenu);
					nav.setChildren(childList);// 给根节点设置子节点
				}
				/**
				 * 输出构建好的菜单数据。
				 *
				 */
				data.put("code", 0);
				data.put("data", rootMenu);
				return data;
			}

		} catch (Exception e) {
			data.put("code", 1);
			data.put("data", new ArrayList());
			data.put("message", "无权限");
		}
		return data;
	}

    public Map<String, Object> findTreeBtn(String username) {
        Map<String, Object> data = new HashMap<String, Object>();
        try {// 查询所有菜单
                // String username="zhangsan"; //测试ok
            List<Permission> allMenu = null;
            if (!StringUtils.isEmpty(username)) {
                allMenu = loginDao.findTree(username);
            } else {
                allMenu = loginDao.findTree2();
            }
            // 根节点
            List<Permission> rootMenu = new ArrayList<Permission>();
            for (Permission nav : allMenu) {
                if (nav.getParentId() == -1) {// 父节点是-1的话,为根节点。
                    rootMenu.add(nav);
                }
            }
            /* 根据Menu类的order排序 */
            Collections.sort(rootMenu, Permission.order());
            // 为根菜单设置子菜单，getClild是递归调用的
            for (Permission nav : rootMenu) {
                /* 获取根节点下的所有子节点 使用getChild方法 */
                List<Permission> childList = getChild(nav.getId(), allMenu);
                nav.setChildren(childList);// 给根节点设置子节点
            }
            /**
             * 输出构建好的菜单数据。
             *
             */
            data.put("code", 0);
            data.put("list", rootMenu);
            return data;
        } catch (Exception e) {
            data.put("code", 1);
            data.put("list", new ArrayList());
            data.put("message", "无权限");
            return data;
        }
    }
}
